package com.lifeng.controller;

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.lifeng.SentinelServiceStart;
import com.lifeng.bean.User;
import com.lifeng.client.UserServiceFeignClient;
import com.lifeng.exception.ExceptionHandler;
import com.lifeng.service.FallBackService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;


/**
 * Created by lifeng on 2019/5/9.
 */
@RestController
public class TestController {
    private static final Logger log = LoggerFactory.getLogger(TestController.class);
    @Resource
    private FallBackService fallBackService;
    @Resource
    private UserServiceFeignClient userServiceFeignClient;

    /**
     * Sentinel 默认为所有的 HTTP 服务提供了限流埋点。引入依赖后自动完成所有埋点
     * 默认URL限流后,但是返回的提示不够友好
     * 如果需要对某个特定的方法进行限流或降级，
     * 可以通过 @SentinelResource 注解来完成限流的埋点
     * */
    @RequestMapping("/test")
    @ResponseBody
    public String test(){
        return "test";
    }

    /**
     * 配置自定义限流规则(@SentinelResource埋点)
     * 限流规则如果没有自定义处理限流逻辑，当请求到达限流的阀值时就返回404页面
     */
    @SentinelResource("hello")
    @RequestMapping("/hello")
    @ResponseBody
    public String hello(){
        log.debug(System.currentTimeMillis()+"-->hello");
        return "hello";
    }

    /**
     * 配置自定义限流规则(@SentinelResource埋点)
     * @SentinelResource 注解包含以下属性：
        value: 资源名称，必需项（不能为空）
        entryType: 入口类型，可选项（默认为 EntryType.OUT）
        blockHandler:blockHandlerClass中对应的异常处理方法名。参数类型和返回值必须和原方法一致
        blockHandlerClass：自定义限流逻辑处理类
        返回类型需要与原方法相匹配，参数类型需要和原方法相匹配并且最后加一个额外的参数，类型为 BlockException
        对应的函数必需为 static 函数


     */
    @SentinelResource(value="demo", blockHandler = "handleException", blockHandlerClass = {ExceptionHandler.class})
    @RequestMapping("/demo")
    @ResponseBody
    public String demo(){
        fallBackService.sayHello();
        return "demo";
    }

    /**测试fegin整合 sentinel*/
    @RequestMapping("/demo1")
    @ResponseBody
    public User demo1(String id){
        return userServiceFeignClient.findById(id);
    }
}
